package com.hqd.jjvm.classformat;

import org.apache.commons.lang.StringUtils;

/**
 * 属性类型
 */
public enum AttributeType {
    /**
     * 方法表	Java代码编译成的字节码指令
     */
    Code("Code"),
    /**
     * 字段表 final关键字定义的常量池
     */
    ConstantValue("ConstantValue"),
    /**
     * 类，方法
     * 字段表 被声明为deprecated的方法和字段
     */
    Deprecated("Deprecated"),

    /**
     * 方法表
     * 方法抛出的异常
     */
    Exceptions("Exceptions"),


    /**
     * 类文件
     * 仅当一个类为局部类或者匿名类是才能拥有这个属性，这个属性用于标识这个类所在的外围方法
     */
    EnclosingMethod("EnclosingMethod"),
    /**
     * 类文件
     * 内部类列表
     */
    InnerClasses("InnerClasses"),
    /**
     * Code属性
     * Java源码的行号与字节码指令的对应关系
     */
    LineNumberTable("LineNumberTable"),
    /**
     * Code属性
     * 方法的局部变量描述
     */
    LocalVariableTable("LocalVariableTable"),
    /**
     * Code属性
     * JDK1.6中新增的属性，供新的类型检查检验器检查和处理目标方法的局部变量和操作数有所需要的类是否匹配
     */
    StackMapTable("StackMapTable"),
    /**
     * 类，方法表
     * 字段表 用于支持泛型情况下的方法签名
     */
    Signature("Signature"),

    /**
     * 类文件
     * 记录源文件名称
     */
    SourceFile("SourceFile"),
    /**
     * 类文件
     * 用于存储额外的调试信息
     */
    SourceDebugExtension("SourceDebugExtension"),
    /**
     * 类，方法表
     * 字段表 标志方法或字段为编译器自动生成的
     */
    Synthetic("Synthetic"),
    /**
     * 类
     * 使用特征签名代替描述符，是为了引入泛型语法之后能描述泛型参数化类型而添加
     */
    LocalVariableTypeTable("LocalVariableTypeTable"),
    /**
     * 类，方法表
     * 字段表 为动态注解提供支持
     */
    RuntimeVisibleAnnotations("RuntimeVisibleAnnotations"),
    /**
     * 表，方法表
     * 字段表 用于指明哪些注解是运行时不可见的
     */
    RuntimeInvisibleAnnotations("RuntimeInvisibleAnnotations"),
    /**
     * 方法表
     * 作用与RuntimeVisibleAnnotations属性类似，只不过作用对象为方法
     */
    RuntimeVisibleParameterAnnotations("RuntimeVisibleParameterAnnotations"),
    /**
     * 方法表
     * 作用与RuntimeInvisibleAnnotations属性类似，作用对象哪个为方法参数
     */
    RuntimeInvisibleParameterAnnotations("RuntimeInvisibleParameterAnnotations"),
    /**
     * 方法表
     * 用于记录注解类元素的默认值
     */
    AnnotationDefault("AnnotationDefault"),
    /**
     * 类文件用于保存invokeddynamic指令引用的引导方式限定符
     */
    BootstrapMethods("BootstrapMethods");
    private String code;

    AttributeType(String code) {
        this.code = code;
    }

    public static AttributeType getTypeByVal(String code) {
        if (StringUtils.isNotBlank(code)) {
            AttributeType[] attributeTypes = AttributeType.values();
            for (AttributeType type : attributeTypes) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
        }
        return null;
    }

    public String getCode() {
        return code;
    }
}
